package com.sinog.biz.service.business.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinog.biz.mapper.havexml.DepartmentMapper;
import com.sinog.biz.mapper.havexml.ReportInfoManageMapper;
import com.sinog.biz.service.business.ReportInfoManageService;
import com.sinog.core.domain.ReportInfoManage;
import com.sinog.core.domain.SystemCode;
import com.sinog.core.model.ReplyMessage;
import com.sinog.core.model.ReportInfo;
import com.sinog.core.util.BusinessUtil;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - ReportInfoManageServiceImpl
 * @author -
 * @date -
 */
@Slf4j
@Service
public class ReportInfoManageServiceImpl implements ReportInfoManageService {

    @Resource
    private ReportInfoManageMapper reportInfoManageMapper;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Resource
    private DepartmentMapper departmentMapper;

    /**
     * 获取首页上报协调列表
     * @param departId departId
     * @param level level
     * @param account account
     * @return List<HashMap<String,Object>>
     */
    @Override
    public List<HashMap<String,Object>> getSySbxtList(String departId,String level,String account) {
        return reportInfoManageMapper.getSySbxtList(departId,level,account);
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 列表
     * @param searchKey searchKey
     * @param sbStartDate sbStartDate
     * @param sbEndDate sbEndDate
     * @param sbdw sbdw
     * @param sbtype sbtype
     * @param tipFlag tipFlag
     * @param departId departId
     * @param pageIndex pageIndex
     * @param pageSize pageSize
     * @return Page<Map<String,String>>
     */
    @Override
    public Page<Map<String,String>> getReportInfoList(String searchKey,String sbStartDate,String sbEndDate,String sbdw,
                                                      String sbtype,String tipFlag,String departId,Integer pageIndex,Integer pageSize) {
        searchKey = StrUtil.converseToNull(searchKey);
        sbStartDate = StrUtil.converseToNull(sbStartDate);
        sbEndDate = StrUtil.converseToNull(sbEndDate);
        sbdw = StrUtil.converseToNull(sbdw);
        sbtype = StrUtil.converseToNull(sbtype);
        tipFlag = StrUtil.converseToNull(tipFlag);
        Page<Map<String,String>> page = new Page<>(pageIndex + 1,pageSize);
        return page.setRecords(reportInfoManageMapper.getReportInfoList(page,searchKey,sbStartDate,sbEndDate,sbdw,sbtype,tipFlag,departId));
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - （新增/更新）
     * @param data data
     * @return boolean
     */
    @Override
    public boolean save(String data) {
        //先将上报协调信息(不包含内容)插入到MySQL中,再向mongo中插入内容,并增加省标识
        //参数实体
        ReportInfoManage reportInfoManage = JsonUtil.toBean(data,ReportInfoManage.class);
        ReportInfoManage isExit = reportInfoManage.selectById(reportInfoManage.getId());
        reportInfoManage.setUpdateUser(reportInfoManage.getCreateUser());
        Date date = new Date();
        reportInfoManage.setUpdateDate(date);
        if(ObjectUtils.isNotEmpty(isExit)){
            reportInfoManage.setUpdateUser(isExit.getCreateUser());
        } else {
            reportInfoManage.setCreateDate(date);
        }
        //直辖市三级上报处理
        //北京、重庆、天津、上海
        if(!StringUtils.isEmpty(reportInfoManage.getUpdanwei()) && BusinessUtil.isZxs(reportInfoManage.getUpdanwei())) {
            reportInfoManage.setUpdanwei(reportInfoManage.getUpdanwei().substring(0,2) + "0000");
        }
        boolean flag = reportInfoManage.insertOrUpdate();
        //向mongo中插入内容,并增加省标识
        if(flag) {
            ReportInfo reportInfo = JsonUtil.toBean(data,ReportInfo.class);
            String province = reportInfoManage.getAddgovid().substring(0,2) + "0000";
            reportInfo.setProvince(province);
            reportInfo.setUpdateUser(reportInfoManage.getUpdateUser());
            try {
                mongoTemplate.save(reportInfo,"reportInfo");
                return true;
            } catch(DataAccessResourceFailureException e) {
                log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
            } catch(RuntimeException e) {
                log.error("发生异常:{}",e.getMessage());
            }
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 回复
     * @param data data
     * @return int
     */
    @Override
    public int reply(String data) {
        //参数转map
        Map<String,String> hashMap = JSON.parseObject(data,Map.class);
        String contentId = String.valueOf(hashMap.get("id"));
        String replytime = hashMap.get("replytime");
        String csjigou = hashMap.get("csjigou");
        String id = String.valueOf(hashMap.get("id"));
        String readtime = hashMap.get("readtime");
        String uploadFlag = hashMap.get("upload_flag");
        String tipFlag = hashMap.get("tip_flag");
        //先将回复信息插入到MySQL数据库的回复表中
        int i = reportInfoManageMapper.insertReplyInfo(contentId,replytime,csjigou);
        //插入成功后将MySQL中上报协调表中的标识及时间更新
        int flag = reportInfoManageMapper.updateReportInfo(id,readtime,uploadFlag,tipFlag);
        if(0 != i*flag) {
            String content = hashMap.get("content1");
            String province = hashMap.get("addgovid").substring(0,2) + "0000";
            //再将回复内容插入到Mongo中
            ReplyMessage replyMessage = new ReplyMessage();
            replyMessage.setContent(content);
            replyMessage.setContentId(contentId);
            replyMessage.setAddtime(new Date());
            replyMessage.setProvince(province);
            try {
                mongoTemplate.save(replyMessage,"replyMessage");
                return i;
            } catch(DataAccessResourceFailureException e) {
                log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
            } catch(RuntimeException e) {
                log.error("发生异常:{}",e.getMessage());
            }
        }
        return 0;
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 获取抄送机构需要的下拉框数据
     * @param departId departId
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getDepartmentType(String departId) {
        List<SystemCode> systemCodes = departmentMapper.getDepartmentType(departId);
        List<Map<String,Object>> list = new ArrayList<>(16);
        for(SystemCode sc : systemCodes) {
            Map<String,Object> map = new HashMap<>(2);
            map.put("codeId",sc.getCodeId());
            map.put("codeName",sc.getCodeName());
            list.add(map);
        }
        return list;
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 查看时获取抄送机构需要的下拉框数据
     * @param departId departId
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getDepartmentTypeInfo(String departId) {
        List<SystemCode> systemCodes = departmentMapper.getDepartmentTypeInfo(departId);
        List<Map<String,Object>> list = new ArrayList<>(16);
        for(SystemCode sc : systemCodes) {
            Map<String,Object> map = new HashMap<>(2);
            map.put("codeId",sc.getCodeId());
            map.put("codeName",sc.getCodeName());
            list.add(map);
        }
        return list;
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 发布上报协调信息
     * @param id id
     * @return int
     */
    @Override
    public int report(String id) {
        return reportInfoManageMapper.report(id);
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 取消发布上报协调信息
     * @param id id
     * @return int
     */
    @Override
    public int withdraw(String id) {
        return reportInfoManageMapper.withdraw(id);
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 修改查看状态
     * @param id id
     * @return int
     */
    @Override
    public int changeState(String id) {
        return reportInfoManageMapper.changeState(id);
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - 修改查看状态
     * @param id id
     * @return String
     */
    @Override
    public String getUpdanweiById(String id) {
        return reportInfoManageMapper.getUpdanweiById(id);
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - mongo 获取上报协调信息
     * @param id id
     * @return ReportInfo
     */
    @Override
    public ReportInfo findReportById(String id) {
        ReportInfo reportInfo = null;
        try {
            reportInfo = mongoTemplate.findById(id,ReportInfo.class);
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
        }
        return reportInfo;
    }

    /**
     * 安帮工作资源管理 - 上报协调信息管理 - 上报协调信息管理 - mongo 获取上报回复信息
     * @param id id
     * @return ReplyMessage
     */
    @Override
    public ReplyMessage findMessgeById(String id) {
        ReplyMessage replyMessage = null;
        try {
            Query query = new Query(Criteria.where("contentId").is(id));
            replyMessage = mongoTemplate.findOne(query,ReplyMessage.class);
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
        }
        return replyMessage;
    }
}